/**
 * Created by liuhaiming on 2016/05/07
 */
var validator = {
    init : function() {
        $.validator.setDefaults({
            focusInvalid: false,
            errorElement : 'span',
            errorClass : 'help-block',
            highlight : function(element) {
                $(element).closest('.form-group').addClass('has-error');
            },
            success : function(label) {
                label.closest('.form-group').removeClass('has-error');
                label.remove();
            },
            errorPlacement : function(error, element) {
                element.parent('div').append(error);
            }
        });

        this.initValid();
    },

    initValid : function() {
        $(".pdk-valid").each(function(){
            $(this).bind("change", function() {
                $(this).valid()
            });
        });
    },

    initIdCardValidatorMethod : function() {
        // 身份证号码验证
        jQuery.validator.addMethod("chkIdCard", function(value, element)  {
            return this.optional(element) || isIdCardNo(value);
        }, "请正确输入您的身份证号码");

    },

    validatorinitPhoneValidatorMethod : function() {
        // 手机号码验证
        jQuery.validator.addMethod("phonenNo", function(value, element) {
            var length = value.length;
            var mobile =  /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/
            return this.optional(element) || (length == 11 && mobile.test(value));

        }, "手机号码格式错误");

    },

    validatorisIdCardNo : function(num) {
        var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
        var parityBit=new Array('1','0','X','9','8','7','6','5','4','3','2');
        var varArray = new Array();
        var intValue;
        var lngProduct = 0;
        var intCheckDigit;
        var intStrLen = num.length;
        var idNumber = num;
        // initialize
        if ((intStrLen != 15) && (intStrLen != 18)) {
            return false;
        }
        // check and set value
        for(var i=0;i<intStrLen;i++) {
            varArray[i] = idNumber.charAt(i);
            if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
                return false;
            } else if (i < 17) {
                varArray[i] = varArray[i] * factorArr[i];
            }
        }

        if (intStrLen == 18) {
            //check date
            var date8 = idNumber.substring(6,14);
            if (this.isDate8(date8) == false) {
                return false;
            }
            // calculate the sum of the products
            for(i=0;i<17;i++) {
                lngProduct = lngProduct + varArray[i];
            }
            // calculate the check digit
            intCheckDigit = parityBit[lngProduct % 11];
            // check last digit
            if (varArray[17] != intCheckDigit) {
                return false;
            }
        }
        else{ //length is 15
            //check date
            var date6 = idNumber.substring(6,12);
            if (this.isDate6(date6) == false) {

                return false;
            }
        }
        return true;
    },

    isDate6 : function(sDate) {
        if(!/^[0-9]{6}$/.test(sDate)) {
            return false;
        }
        var year, month, day;
        year = sDate.substring(0, 4);
        month = sDate.substring(4, 6);
        if (year < 1700 || year > 2500) return false
        if (month < 1 || month > 12) return false
        return true
    },

    isDate8 : function(sDate) {
        if(!/^[0-9]{8}$/.test(sDate)) {
            return false;
        }
        var year, month, day;
        year = sDate.substring(0, 4);
        month = sDate.substring(4, 6);
        day = sDate.substring(6, 8);
        var iaMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
        if (year < 1700 || year > 2500) return false
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1]=29;
        if (month < 1 || month > 12) return false
        if (day < 1 || day > iaMonthDays[month - 1]) return false
        return true
    }
};